package edu.pod.hoteishilton.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

public class Hotel implements Serializable {

    private String apelido;
    private String endereco;
    private String nomeGerente;
    private String telefone;
    private ArrayList<Quarto> quartos;
    private HashMap reservas;

    public Hotel(String apelido, String endereco, String nomeGerente, String telefone) {
        super();
        this.apelido = apelido;
        this.endereco = endereco;
        this.nomeGerente = nomeGerente;
        this.telefone = telefone;
        this.quartos = new ArrayList();
        this.reservas = new HashMap();
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNomeGerente() {
        return nomeGerente;
    }

    public void setNomeGerente(String nomeGerente) {
        this.nomeGerente = nomeGerente;
    }

    public ArrayList<Quarto> getQuartos() {
        return quartos;
    }

    public void setQuartos(ArrayList<Quarto> quartos) {
        this.quartos = quartos;
    }

    public void addQuarto(Quarto quarto) {
        quarto.setHotel(this);
        this.quartos.add(quarto);
    }

    public HashMap getReservas() {
        return reservas;
    }

    public void setReservas(HashMap reservas) {
        this.reservas = reservas;
    }

    public String getApelido() {
        return apelido;
    }

    public void setApelido(String apelido) {
        this.apelido = apelido;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public int getNumeroDeQuartos() {
        return this.quartos.size();
    }

    public ArrayList<Quarto> getQuartosVazios() {
        ArrayList<Quarto> quartosVazios = new ArrayList();
        for (Quarto quarto : quartos) {
            if (!quarto.isOcupado()) {
                quartosVazios.add(quarto);
            }
        }
        if (quartosVazios.isEmpty()) {
            return null;
        }
        return quartosVazios;
    }

    public ArrayList<Quarto> getQuartosOcupados() {
        ArrayList<Quarto> quartosOcupados = new ArrayList();
        for (Quarto quarto : this.quartos) {
            if (quarto.isOcupado()) {
                quartosOcupados.add(quarto);
            }
        }
        if (quartosOcupados.isEmpty()) {
            return null;
        }
        return quartosOcupados;
    }

    public int getUltimoQuarto() {
        return this.quartos.size();
    }

    @Override
    public String toString() {
        return "Hotel{" + "apelido=" + apelido + ", endereco=" + endereco + ", "
                + "nomeGerente=" + nomeGerente + ", telefone=" + telefone + '}';
    }

    public int isReservaPossivel(Date dataDeEntrada, Date dataDeSaida, Hospede hospede) {
        int numQuartosDisponiveis = quartos.size();

        for (Iterator it = reservas.values().iterator(); it.hasNext();) {
            Reserva r = (Reserva) it.next();

            if (dataDeEntrada.equals(r.getDataEntrada().getTime())) {
                if(r.getHospede().getCpf().equals(hospede.getCpf())){
                    return 1;
                }
                numQuartosDisponiveis--;
                continue;
            }

            if ((dataDeEntrada.before(r.getDataEntrada().getTime())) && (dataDeSaida.after(r.getDataEntrada().getTime()) && (dataDeSaida.before(r.getDataSaida().getTime()) || dataDeSaida.equals(r.getDataSaida().getTime())))) {
                if(r.getHospede().getCpf().equals(hospede.getCpf())){
                    return 1;
                }
                numQuartosDisponiveis--;
                continue;
            }

            if ((dataDeEntrada.after(r.getDataEntrada().getTime()) && (dataDeEntrada.before(r.getDataSaida().getTime())))){
                if(r.getHospede().getCpf().equals(hospede.getCpf())){
                    return 1;
                }
                numQuartosDisponiveis--;
                continue;
            }
            
        }

        if (numQuartosDisponiveis > 0) {
            return 3;
        }
        return 2;
    }

    public void addReserva(Reserva reserva) {
        reserva.setHotel(this);
        reservas.put(reserva.getId(), reserva);
    }

    public boolean isReservaExistente(Date dataDeEntrada, Date dataDeSaida, Hospede hospede) {


        for (Iterator it = reservas.values().iterator(); it.hasNext();) {
            Reserva r = (Reserva) it.next();
            if ((dataDeEntrada.equals(r.getDataEntrada().getTime())) || (dataDeEntrada.after(r.getDataEntrada().getTime()) && dataDeEntrada.before(r.getDataSaida().getTime()))) {
            }
        }

        return false;
    }

    public void delReserva(Reserva reserva) {
        reservas.remove(reserva.getId());
    }

    public Quarto getQuarto(int numeroQuarto) {
        for(Quarto q: quartos){
            if(q.getNumeroQuarto() == numeroQuarto){
                return q;
            }
        }
        return null;
    }
}
